﻿/* 
 *Js扩展日期
 *格林尼治标准时区的1970年1月1日0时开始计算
 *
 *	定义各种格式
 	var someDate=new Date("Month dd,yyyy hh:mm:ss.SS");
	var someDate=new Date("Month dd,yyyy")
	var someDate=new Date(yy,mm,dd,hh,mm,ss.SS)
	var someDate=new Date(GMT milliseconds from 1/1/1970)
	
	var dateObject = new Date();
	dateObject.getTime() 0~... 从GTM1970年1月1日0：00：00开始计算的毫秒数。
	dateObject.getYear() 70~... 指定的年份减去1900，2000年后为4位数表示的年份。
	dateObject.getFullYear() 1970~... 4位数年份，适用于版本4以上的浏览器。
	dateObject.getMonth() 0~11 一年中的月份(1月为0)。
	dateObject.getDate() 1~31 一月中的日期。
	dateObject.getDay() 0~6 星期(星期日为0)。
	dateObject.getHours() 0~23 一天中指定的小时数，采用24小时制。
	dateObject.getMinutes() 0~59 指定小时内的分钟数。
	dateObject.getSeconds() 0~59 指定分钟内的秒数。
	dateObject.getMilliseconds(); //获取当前毫秒数(0-999) 
	dateObject.toLocaleDateString(); //获取当前日期 
	dateObject.setTime(val) 0~... 从GTM1970年1月1日0：00：00开始计算的毫秒数。
	dateObject.setYear(val) 70~... 指定的年份减去1900，2000年后为4位数表示的年份。
	dateObject.setMonth(val) 0~11 一年中的月份(1月为0)。
	dateObject.setDate(val) 1~31 一月中的日期。
	dateObject.setDay(val) 0~6 星期(星期日为0)。
	dateObject.setHours(val) 0~23 一天中的小时数，采用24小时值。
	dateObject.setMinutes(val) 0~59 指定小时内的分钟数。
	dateObject.setSecond(val) 0~59 指定小时内的秒数。
	想要用Date.parse，时间格式必须是MM-dd-yyyy HH:mm:ss:SS
	应该这样写：Date.parse("01-01-2010 12:30:30.030")
	
	日期格式举例；
	1、2004-09-12 11:06:08.177
	2、2004-09-12 11:06:08 
	3、20040912110608177
	4、2004/09/12
	5、20040912
	6、2004.09.12
	7、09/12/2004 
	8、12/09/2004 
	9、12.09.2004 
	10、12-09-2004 
	11、12 09 2004 
	12、09 12, 2004
	13、11:06:08 
	14、09 12 2004 1
	15、09-12-2004
	16、12 09 2004 1
	17、11:06:08.177 
Date 对象的方法简介：

　　·getDate　　　　　　｜　根据本地时间获取当前日期(本月的几号)
　　·getDay　　 　　　　｜　根据本地时间获取今天是星期几(0-Sunday,1-Monday...)
　　·getFullYear　　　　｜　根据本地时间获取当前年份(四位数字)
　　·getHours　　 　　　｜　根据本地时间获取当前小时数(24小时制,0-23)
　　·getMilliseconds　　｜　根据本地时间获取当前毫秒数
　　·getMinutes　　　 　｜　根据本地时间获取当前分钟数
　　·getMonth　　　　 　｜　根据本地时间获取当前月份(注意从0开始:0-Jan,1-Feb...)
　　·getSeconds　　　 　｜　根据本地时间获取当前秒数
　　·getTime　　　　　　｜　获取UTC格式的从1970.1.1 0:00以来的毫秒数
　　·getTimezoneOffset　｜　获取当前时间和UTC格式的偏移值(以分钟为单位)
　　·getUTCDate　　　　 ｜　获取UTC格式的当前日期(本月的几号)
　　·getUTCDay　　　　　｜　获取UTC格式的今天是星期几(0-Sunday,1-Monday...)
　　·getUTCFullYear　　 ｜　获取UTC格式的当前年份(四位数字)
　　·getUTCHours　　　　｜　获取UTC格式的当前小时数(24小时制,0-23)
　　·getUTCMilliseconds ｜　获取UTC格式的当前毫秒数
　　·getUTCMinutes　　　｜　获取UTC格式的当前分钟数
　　·getUTCMonth　　　　｜　获取UTC格式的当前月份(注意从0开始:0-Jan,1-Feb...)
　　·getUTCSeconds　　　｜　获取UTC格式的当前秒数
　　·getYear　　　　　　｜　根据本地时间获取当前缩写年份(当前年份减去1900)
　　·setDate　　　　　　｜　设置当前日期(本月的几号)
　　·setFullYear　　　　｜　设置当前年份(四位数字)
　　·setHours　　　　　 ｜　设置当前小时数(24小时制,0-23)
　　·setMilliseconds　　｜　设置当前毫秒数
　　·setMinutes　　　　 ｜　设置当前分钟数
　　·setMonth　　　　　 ｜　设置当前月份(注意从0开始:0-Jan,1-Feb...)
　　·setSeconds　　　　 ｜　设置当前秒数
　　·setTime　　　　　　｜　设置UTC格式的从1970.1.1 0:00以来的毫秒数
　　·setUTCDate　　　　 ｜　设置UTC格式的当前日期(本月的几号)
　　·setUTCFullYear　　 ｜　设置UTC格式的当前年份(四位数字)
　　·setUTCHours　　　　｜　设置UTC格式的当前小时数(24小时制,0-23)
　　·setUTCMilliseconds ｜　设置UTC格式的当前毫秒数
　　·setUTCMinutes　　　｜　设置UTC格式的当前分钟数
　　·setUTCMonth　　　　｜　设置UTC格式的当前月份(注意从0开始:0-Jan,1-Feb...)
　　·setUTCSeconds　　　｜　设置UTC格式的当前秒数
　　·setYear　　　　　　｜　设置当前缩写年份(当前年份减去1900)
　　·toString　　　　　 ｜　将日期时间值转换成"日期/时间"形式的字符串值
　　·Date.UTC　　　　　 ｜　返回指定的UTC格式日期时间的固定时间值

创建新的 Date 对象

　　语法：
　　　new Date();
　　　new Date(year [, month [, date [, hour [, minute [, second [, millisecond ]]]]]] );
　　参数：
　　　year 　　　　是一个 0 到 99 之间的整数，对应于 1900 到 1999 年，或者为四位数字指定确定的年份；
　　　month　　　　是一个 0 (一月) 到 11 (十二月) 之间的整数，这个参数是可选的；
　　　date　 　　　是一个 1 到 31 之间的整数，这个参数是可选的；
　　　hour 　　　　是一个 0 (0:00am) 到 23 (11:00pm) 之间的整数，这个参数是可选的；
　　　minute 　　　是一个 0 到 59 之间的整数，这个参数是可选的；
　　　second 　　　是一个 0 到 59 之间的整数，这个参数是可选的；
　　　millisecond　是一个 0 到 999 之间的整数，这个参数是可选的；

*/

/*
 *判断闰年
*/
Date.prototype.isLeapYear = function(){
	return (0==this.getYear()%4&&((this.getYear()%100!=0)||(this.getYear()%400==0)));
};

/*
 *日期格式化
 *格式 YYYY/yyyy/YY/yy 表示年份
 *MM/M 月份
 *W/w 星期
 *dd/DD/d/D 日期
 *hh/HH/h/H 时间
 *mm/m 分钟
 *ss/SS/s/S 秒
 *
*/

Date.prototype.Format = function(formatStr){
	var str = formatStr;
	var Week = ['日','一','二','三','四','五','六'];
	return str.replace(/yyyy|YYYY/,this.getFullYear()).replace(/yy|YY/,(this.getYear()%100)>9?(this.getYear()%100).toString():'0'+(this.getYear()%100)).replace(/MM/,(this.getMonth()+1)>9?(this.getMonth()+1).toString():'0' + (this.getMonth()+1)).replace(/M/g,(this.getMonth()+1)).replace(/w|W/g,Week[this.getDay()]).replace(/dd|DD/,this.getDate()>9?this.getDate().toString():'0' + this.getDate()).replace(/d|D/g,this.getDate()).replace(/hh|HH/,this.getHours()>9?this.getHours().toString():'0' + this.getHours()).replace(/h|H/g,this.getHours()).replace(/mm/,this.getMinutes()>9?this.getMinutes().toString():'0' + this.getMinutes()).replace(/m/g,this.getMinutes()).replace(/ss/,this.getSeconds()>9?this.getSeconds().toString():'0' + this.getSeconds()).replace(/s/g,this.getSeconds()).replace(/SS/,this.getMilliseconds()>9?this.getMilliseconds().toString():'0' + this.getMilliseconds()).replace(/S/g,this.getMilliseconds());
};

//日期计算
Date.prototype.DateAdd = function(strInterval, Number){
	var dtTmp = this;
	switch(strInterval){
		case 'ss': return new Date(dtTmp.getFullYear(), dtTmp.getMonth(), dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds(), dtTmp.getMilliseconds()+ Number); break;
		case 's': return new Date(Date.parse(dtTmp) + (1000 * Number)); break;
		case 'n': return new Date(Date.parse(dtTmp) + (60000 * Number)); break;
		case 'h': return new Date(Date.parse(dtTmp) + (3600000 * Number)); break;
		case 'd': return new Date(Date.parse(dtTmp) + (86400000 * Number)); break;
		case 'w': return new Date(Date.parse(dtTmp) + (86400000 * 7)* Number); break;
		case 'q': return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number*3, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds(), dtTmp.getMilliseconds()); break; 
		case 'm': return new Date(dtTmp.getFullYear(), (dtTmp.getMonth()) + Number, dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds(), dtTmp.getMilliseconds()); break;
		case 'y': return new Date((dtTmp.getFullYear() + Number), dtTmp.getMonth(), dtTmp.getDate(), dtTmp.getHours(), dtTmp.getMinutes(), dtTmp.getSeconds(), dtTmp.getMilliseconds()); break;
	}
};

//取得当前日期所在周是一年中的第几周
Date.prototype.WeekOfYear = function(){
	var myDate = this;
	var ary = myDate.toArray();
	var year = ary[0];
	var month = ary[1] + 1;
	var day = ary[2];
	document.write('<script language=VBScript\> \n');
	document.write('myDate = DateValue('+ month + '-' + day +'-'+ year+ ')\n');
	document.write("result = DatePart('ww',myDate)\n");
	document.write('\n');
	return result;
};

//取得当前日期所在月的最大天数
Date.prototype.MaxDayOfDate = function(){
	var myDate = this;
	var ary = myDate.toArray();
	var date1 = (new Date(ary[0],ary[1]+1,1));
	var date2 = date1.DateAdd('m',1);
	var result = DateDiff(date1.Format('yyyy-MM-dd'),date2.Format('yyyy-MM-dd'));
	return result
};

//+--------------------------------------------------- 
//| 取得日期数据信息
//| 参数 interval 表示数据类型   
//| y 年 m月 d日 w星期 ww周 h时 n分 s秒
//+---------------------------------------------------   
Date.prototype.DatePart = function(interval){
	var myDate = this;
	var partStr = '';
	var Week = ['日','一','二','三','四','五','六'];
	switch(interval){
		case 'y' : partStr = myDate.getFullYear();break;
		case 'm' : partStr = myDate.getMonth()+1;break;
		case 'd' : partStr = myDate.getDate(); break;
		case 'w' : partStr = Week[myDate.getDay()];break;
		case 'ww' : partStr = myDate.WeekOfYear();break;
		case 'h' : partStr = myDate.getHours();break;
		case 'n' : partStr = myDate.getMinutes();break;
		case 's' : partStr = myDate.getSeconds();break;
		case 'ms' : partStr = myDate.getMilliseconds();break;
	}
	return partStr;
};

//把日期分割成数组
Date.prototype.toArray = function(){
	var myDate = this;
	var myArray = Array();
	myArray[0] = myDate.getFullYear();
	myArray[1] = myDate.getMonth();
	myArray[2] = myDate.getDate();
	myArray[3] = myDate.getHours();
	myArray[4] = myDate.getMinutes();
	myArray[5] = myDate.getSeconds();
	myArray[6] = myDate.getMilliseconds();
	return myArray;
};


//日期转为字符串，重载系统的toString方法
/*Date.prototype.toString = function(showWeek){
	var myDate = this;
	var str = myDate.toLocaleDateString();
	if(showWeek){
		var Week = ['日','一','二','三','四','五','六'];
		str +='星期' + Week[myDate.getDay()];
	}
	return str;
};*/

//日期时间检查 格式为：YYYY-MM-DD HH:MM:SS或YYYY-MM-DD HH:MM:SS.MS 判断各种格式目前已知17种，预先判断长度，在验证是否符合
window.checkDateTime = function(str){
	var dLen = strLen(str);
	switch(dLen){
		case 19: 
			var regDate = /^(\d+)-(\d{1,2})-(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2})$/;
			var r = str.match(regDate);
			if(r==null)return false;
			r[2] = r[2]-1;
			var d = new Date(r[1],r[2],r[3],r[4],r[5],r[6]);
			if(d.getFullYear()!=r[1]) return false;
			if(d.getMonth()!=r[2]) return false;
			if(d.getDate()!=r[3]) return false;
			if(d.getHours()!=r[4]) return false;
			if(d.getMinutes()!=r[5]) return false;
			if(d.getSeconds()!=r[6]) return false;
			return true;
		break;
		case 23:
		 	var regDate = /^(\d+)-(\d{1,2})-(\d{1,2}) (\d{1,2}):(\d{1,2}):(\d{1,2}).(\d{1,3})$/;
			var r = str.match(regDate);
			if(r==null)return false;
			r[2] = r[2]-1;
			var d = new Date(r[1],r[2],r[3],r[4],r[5],r[6],r[7]);
			if(d.getFullYear()!=r[1]) return false;
			if(d.getMonth()!=r[2]) return false;
			if(d.getDate()!=r[3]) return false;
			if(d.getHours()!=r[4]) return false;
			if(d.getMinutes()!=r[5]) return false;
			if(d.getSeconds()!=r[6]) return false;
			if(d.getMilliseconds()!=r[7]) return false;
			return true;
		break;
	}
};

//字符编码数值对应的存储长度：     
//UCS-2编码(16进制) UTF-8 字节流(二进制)    
//0000 - 007F       0xxxxxxx （1字节）     
//0080 - 07FF       110xxxxx 10xxxxxx （2字节）     
//0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx （3字节）    
String.prototype.getBytesLength = function() {   
    var totalLength = 0;     
    var charCode;  
    for (var i = 0; i < this.length; i++) {  
        charCode = this.charCodeAt(i);  
        if (charCode < 0x007f)  {     
            totalLength++;     
        } else if ((0x0080 <= charCode) && (charCode <= 0x07ff))  {     
            totalLength += 2;     
        } else if ((0x0800 <= charCode) && (charCode <= 0xffff))  {     
            totalLength += 3;   
        } else{  
            totalLength += 4;   
        }          
    }  
    return totalLength;   
};

/*	
 *求两个日期的天差数 日期格式为 YYYY-MM-dd 方法一
*/
window.daysBetween = function(DateOne,DateTwo){
	var OneMonth = DateOne.substring(5,DateOne.lastIndexOf('-'));
	var OneDay = DateOne.substring(DateOne.length,DateOne.lastIndexOf('-') + 1);
	var OneYear = DateOne.substring(0,DateOne.indexOf('-'));
	var TwoMonth = DateTwo.substring(5,DateOne.lastIndexOf('-'));
	var TwoDay = DateTwo.substring(DateTwo.length,DateTwo.lastIndexOf('-') + 1);
	var TwoYear = DateTwo.substring(0,DateTwo.indexOf('-'));
	
	var dateTime = ((Date.parse(OneMonth + '/' + OneDay + '/' + OneYear)-Date.parse(TwoMonth + '/' + TwoDay + '/' + TwoYear))/86400000);
	return Math.abs(dateTime);
};

//两个日期的差值(d1 - d2)方法二
window.DateDiff = function(d1,d2){
	var dateArr1 = d1.split("-");
	var checkDate1 = new Date();
	checkDate1.setFullYear(dateArr1[0], dateArr1[1]-1, dateArr1[2]);
	var checkTime1 = checkDate1.getTime();

	var dateArr2 = d2.split("-");
	var checkDate2 = new Date();
	checkDate2.setFullYear(dateArr2[0], dateArr2[1]-1, dateArr2[2]);
	var checkTime2 = checkDate2.getTime();

	//var cha = Math.abs((checkTime2 - checkTime1)/86400000); 
	var cha = Math.round((checkTime2 - checkTime1)/86400000); 
	return cha;
};

//+---------------------------------------------------   
//| 比较日期差 dtEnd 格式为日期型或者 有效日期格式字符串   
//+---------------------------------------------------  
/*Date.prototype.DateDiff = function(strInterval, dtEnd){
	var dtStart = this;
	if(typeof dtEnd == 'string'){
		dtEnd = StrToDate(dtStart);	
	}
	switch(strInterval, dtEnd){
		case 's' :return parseInt((dtEnd - dtStart) / 1000);   
        case 'n' :return parseInt((dtEnd - dtStart) / 60000);   
        case 'h' :return parseInt((dtEnd - dtStart) / 3600000);   
        case 'd' :return parseInt((dtEnd - dtStart) / 86400000);   
        case 'w' :return parseInt((dtEnd - dtStart) / (86400000 * 7));   
        case 'm' :return (dtEnd.getMonth()+1)+((dtEnd.getFullYear()-dtStart.getFullYear())*12) - (dtStart.getMonth()+1);   
        case 'y' :return dtEnd.getFullYear() - dtStart.getFullYear();   
	}
};*/

//日期合法性验证 格式为：YYYY-MM-DD或YYYY/MM/DD 
window.isValidDate = function(DateStr){
	var sDate = DateStr.replace();//去掉两边空格
	if(sDate=='')return true;
	//如果格式满足YYYY-(/)MM-(/)DD或YYYY-(/)M-(/)DD或YYYY-(/)M-(/)D或YYYY-(/)MM-(/)D就替换为''
	//数据库中，合法日期可以是:YYYY-MM/DD(2003-3/21),数据库会自动转换为YYYY-MM-DD格式
	var s = sDate.replace(/[\d]{ 4,4 }[\-/]{ 1 }[\d]{ 1,2 }[\-/]{ 1 }[\d]{ 1,2 }/g,'');
	if(s==''){
		var t = new Date(sDate.replace(/\-/g,'/'));
		var ar = sDate.split(/[-/:]/);
		if(ar[0]!=t.getYear() || ar[1]!= t.getMonth() +1 || ar[2] != t.getDate())
		{
			alert('错误的日期格式！格式为：YYYY-MM-DD或YYYY/MM/DD');	
			return false;
		}else{
			alert('错误的日期格式！格式为：YYYY-MM-DD或YYYY/MM/DD');	
			return false;
		}
		return true;
	}
};

//字符串转成日期类型
//格式为：MM/dd/YYYY MM-dd-YYYY YYYY/MM/dd YYYY-MM-dd
window.StrToDate = function(StrDate){
	var converted = Date.parse(StrDate);
	var myDate = new Date(converted);
	if(isNaN(myDate)){
		var arys = StrDate.split('-');
		myDate = new Date(arys[0], --arys[1], arys[2]);
	}
	return myDate;
};

//获取字符串的长度
window.strLen = function(str){
	var i, sum;
	sum=0;
	for(i=0;i<str.length;i++){
		if((str.charCodeAt(i)>=0) && (str.charCodeAt(i)<=255))
			sum = sum + 1;
		else 
			sum = sum + 2;
	}
	return sum;
};

//类型判断
window.type = function(o){
	var t=Object.prototype.toString.call(o),l=t.length;
	return o==null?String(o):t.slice(8,l-1);  	
};

window.strToDate = function(str){
	var str = new Date(str.replace(/^(\d{4})(\d{2})(\d{2})$/,"$1/$2/$3"));
	return str;
};
window.strToDate2 = function(str){
	var str = new Date(str.replace(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})$/,"$1/$2/$3 $4:$5"));
	return str;
};

//根据时间输出标准的时间格式传入各种类型的字符串，时间对象
window.funDateTime = function(strDate,dateFormat){
	var strType = type(strDate);
	switch(strType){
		case "String":
			var len = strLen(strDate);
			var strDate = strToDate2(strDate);
			switch(len){
				case 17:
					return strDate.Format("yyyy-MM-dd HH:mm:ss.SS");
					break;
				case 14:
					return strDate.Format("yyyy-MM-dd HH:mm:ss");
					break;
				case 12:
					return strDate.Format("yyyy-MM-dd HH:mm");
					break;
				case 10:
					return strDate.Format("yyyy-MM-dd HH");
					break;
				case 8:
					return strDate.Format("yyyy-MM-dd");
					break;
				case 6:
					return strDate.Format("yyyy-MM");
					break;
				case 4:
					return strDate.Format("yyyy");
					break;
			}
		break;
		case "Date":
			switch(dateFormat){
				case 1 :
					return strDate.Format("MM-dd-yyyy HH:mm:ss.SS");
					break;
				case 2 :
					return strDate.Format("MM-dd-yyyy HH:mm:ss");
					break;
				case 3 :
					return strDate.Format("yyyy-MM-dd HH:mm:ss.SS");
					break;
				case 4 :
					return strDate.Format("yyyy-MM-dd HH:mm:ss");
					break;
				case 5 :
					return strDate.Format("yyyy/MM/dd HH:mm:ss.SS");
					break;
				case 6 :
					return strDate.Format("yyyy-MM-dd HH:mm:ss.SS");
					break;
				case 7 :
					return strDate.Format("yyyy-MM-dd");
					break;
				case 8 :
					return strDate.Format("yyyy/MM/dd");
					break;
				case 9 :
					return strDate.Format("yyyy年MM月dd日");
					break;
				case 10 :
					return strDate.Format("yyyy.MM.dd");
					break;
			}
		break;
			
	}
};
